草庐IT

Java final 与 C++ const

全部标签

c++ - 是否应该通过 const 引用传递小的简单结构?

我一直被教导非原始类型应该通过const引用而不是在可能的情况下通过值传递,即:voidfoo(std::stringstr);//badvoidfoo(conststd::string&str);//good但我今天在想,也许实际上一些简单的用户定义类型实际上可能更好地按值传递,例如:classVector2{public:floatx,y;...constructors,operatorsoverloads,utilitymethods,etc...};voidfoo(Vector2pos);voidfoo(constVector2&pos);//isthisreallybette

c++ - 为什么Visual C++在C中而不是从C++中警告从const void **到void *的隐式强制转换?

概要当C程序试图将指向const数据的指针(如constvoid**或constchar**)转换为void*时,MicrosoftVisualStudio中的C/C++编译器会给出警告C4090(即使这种类型实际上并非指向const的指针)。更奇怪的是,同一个编译器静默地接受作为C++编译的相同代码。这种不一致的原因是什么?为什么VisualStudio(与其他编译器不同)在将指向const的指针隐式转换为void*时存在问题?细节我有一个C程序,其中将通过变量参数列表传递的C字符串读入数组(通过调用va_arg的循环)。由于C字符串的类型为constchar*,因此跟踪它们的数组的

c++ - 为什么Visual C++在C中而不是从C++中警告从const void **到void *的隐式强制转换?

概要当C程序试图将指向const数据的指针(如constvoid**或constchar**)转换为void*时,MicrosoftVisualStudio中的C/C++编译器会给出警告C4090(即使这种类型实际上并非指向const的指针)。更奇怪的是,同一个编译器静默地接受作为C++编译的相同代码。这种不一致的原因是什么?为什么VisualStudio(与其他编译器不同)在将指向const的指针隐式转换为void*时存在问题?细节我有一个C程序,其中将通过变量参数列表传递的C字符串读入数组(通过调用va_arg的循环)。由于C字符串的类型为constchar*,因此跟踪它们的数组的

c++ - 使用结构化绑定(bind)标记为 const 的变量不是 const

我一直在编写一组类来实现类似python的简单zip函数。以下代码段(几乎)按预期工作。但是a和b这两个变量不是const。std::vectorv1{0.0,1.1,2.2,3.3};std::vectorv2{0,1,2};for(autoconst&[a,b]:zip(v1,v2)){std::cout我一直在使用gcc7.3.0。这是MCVE:#include#include#includetemplateclasszip_iterator{usingvalue_iterator_type=std::tuple()))...>;usingvalue_type=std::tupl

c++ - 使用结构化绑定(bind)标记为 const 的变量不是 const

我一直在编写一组类来实现类似python的简单zip函数。以下代码段(几乎)按预期工作。但是a和b这两个变量不是const。std::vectorv1{0.0,1.1,2.2,3.3};std::vectorv2{0,1,2};for(autoconst&[a,b]:zip(v1,v2)){std::cout我一直在使用gcc7.3.0。这是MCVE:#include#include#includetemplateclasszip_iterator{usingvalue_iterator_type=std::tuple()))...>;usingvalue_type=std::tupl

c++ - 用 str(const char*) 设置 std::stringstream 的内容会产生奇怪的后果

我使用std::stringstream广泛用于生成代码。在使用str()设置内容时,我遇到了一些奇怪的行为。函数,然后使用operator.有人可以向我解释这种行为。非常感谢-谢谢。示例一:std::stringstreamssa;ssa.str("Settingstring");std::cout输出:Settingstringaddingtostring预期:SettingstringSettingstringaddingtostring所以在阅读了一些文档之后,我发现我应该将打开模式设置为ios_base::ate:std::stringstreamssb(std::ios_b

c++ - 用 str(const char*) 设置 std::stringstream 的内容会产生奇怪的后果

我使用std::stringstream广泛用于生成代码。在使用str()设置内容时,我遇到了一些奇怪的行为。函数,然后使用operator.有人可以向我解释这种行为。非常感谢-谢谢。示例一:std::stringstreamssa;ssa.str("Settingstring");std::cout输出:Settingstringaddingtostring预期:SettingstringSettingstringaddingtostring所以在阅读了一些文档之后,我发现我应该将打开模式设置为ios_base::ate:std::stringstreamssb(std::ios_b

c++ - 对临时对象成员的 const 引用

这个问题在这里已经有了答案:Aboutbindingaconstreferencetoasub-objectofatemporary(3个回答)关闭6年前。常量引用延长函数返回的临时对象的生命周期是C++的knownfeature,但是对函数返回的临时对象的成员使用常量引用是否可以接受?示例:#includestd::pairgetPair(intn){return{std::to_string(n),n};}intmain(int,char*[]){constintx=123456;constauto&str=getPair(x).first;printf("%d=%s\n",x,s

c++ - 对临时对象成员的 const 引用

这个问题在这里已经有了答案:Aboutbindingaconstreferencetoasub-objectofatemporary(3个回答)关闭6年前。常量引用延长函数返回的临时对象的生命周期是C++的knownfeature,但是对函数返回的临时对象的成员使用常量引用是否可以接受?示例:#includestd::pairgetPair(intn){return{std::to_string(n),n};}intmain(int,char*[]){constintx=123456;constauto&str=getPair(x).first;printf("%d=%s\n",x,s

c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?

以下代码片段摘自cppref:std::tuplef();auto[x,y]=f();//decltype(x)isint//decltype(y)isint&constauto[z,w]=f();//decltype(z)isconstint//decltype(w)isint&我的问题在最后一行:为什么是decltype(w)int&而不是constint&? 最佳答案 Jarod42回答了评论中的问题,让我在这里引用标准的相关部分,来自[dcl.struct.bind]¹:GiventhetypeTidesignatedbys